﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Job.Core;


namespace App.Validate
{
    public class StringLengthValidator: Validator
    {
        public int LowerBound { get;  private set; }
        public int UpperBound { get; private set; }

        public ValidatorEnum ValidatorType { get; set; }

        public StringLengthValidator(string messageTemplate, int lowerBound, int upperBound)
            :base(messageTemplate)
        {
            this.LowerBound = lowerBound;
            this.UpperBound = upperBound;
        }

        public StringLengthValidator(string messageTemplate, int lowerBound)
            : base(messageTemplate)
        {
            this.LowerBound = lowerBound;
            this.UpperBound = int.MaxValue;
        }
        
        public StringLengthValidator(string messageTemplate, ValidatorEnum validatorType)
            : base(messageTemplate)
        {
            this.ValidatorType = validatorType;
        }

        public override ValidationError Validate(object objectToValidate)
        {
            if (objectToValidate == null)
            {
                return null;
            }
            string strValue = objectToValidate as string;
            if (strValue == null)
            {
                return null;
            }

            if (ValidatorType != ValidatorEnum.None)
            {
                if (string.IsNullOrEmpty(strValue))
                {
                    return null;
                }
                //switch (ValidatorType)
                //{
                //    case ValidatorEnum.非空:
                //        if (!string.IsNullOrEmpty(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.英文:
                //        if (VerificationHelper.IsChineseStr(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.英文字符:
                //        if (VerificationHelper.IsEnglish(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.邮箱:
                //        if (VerificationHelper.IsEmail(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.中文:
                //        if (VerificationHelper.IsChineseStr(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.中文字符:
                //        if (VerificationHelper.IsChinese(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.网址:
                //        if (CRegex.CheckUrl(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.数字:
                //        if (VerificationHelper.IsNum(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.日期:
                //        if (VerificationHelper.IsDate(strValue) || VerificationHelper.IsDatetime(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.时间:
                //        if (VerificationHelper.IsDatetime(strValue))
                //            return null;
                //        break;

                //    case ValidatorEnum.不限:
                //        return null;
                //        break;
                //}
            }
            else
            {
                if (strValue.Length >= this.LowerBound && strValue.Length <= this.UpperBound)
                {
                    return null;
                }
            }
            return this.CreateValidationError(objectToValidate);
        }

        public override void FormatMessage(object objectToValidate)
        {
            base.FormatMessage(objectToValidate);
            this.MessageTemplate = this.MessageTemplate.Replace("{LowerBound}", this.LowerBound.ToString())
                .Replace("{UpperBound}", this.UpperBound.ToString())
                .Replace("{StrType}", this.ValidatorType.ToString());
        }
    }
}
